﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EntitiesLayer;
using DAL;
using Exceptions;

namespace BLL
{
    public class Gestor
    {

        private UnitOfWork UoW = new UnitOfWork();

        #region listarEjercicios
        public IEnumerable<Ejercicio> listarEjercicios()
        {
            return UoW.EjercicioRepository.GetAll();
        }
        #endregion listarEjercicios

        #region listarMusculos
        public IEnumerable<Musculo> listaMusculos()
        {
            return UoW.MusculoRepository.GetAll();
        }
        #endregion listarMusculos

        #region listaPermisos
        public IEnumerable<int> listaPermisos(int pidRol)
        {
            return UoW.RolRepository.GetPermisos(pidRol);
        }
        #endregion listarMusculos

        #region agregarEjercicio
        //metodo para registrar un ejercicio
        public void agregarEjercicio(String pnombreComun, String pnombreOpcional, String pcodigo, String pimagenInicial, String pimagenFinal, String pnombreMusculoPrincipal, List<Musculo> plistaMusculos, String perroresComunes, String pindicacionesGenerales)
        {
            try
            {
                Ejercicio objEjercicio = new Ejercicio(pnombreComun, pnombreOpcional, pcodigo, pimagenInicial, pimagenFinal, pnombreMusculoPrincipal, plistaMusculos, perroresComunes, pindicacionesGenerales);
                if (objEjercicio.IsValid)
                {
                    UoW.EjercicioRepository.Insert(objEjercicio);
                    UoW.EjercicioRepository.Save();
                    UoW.EjercicioRepository.Clear();
                }
                else
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (RuleViolation rv in objEjercicio.GetRuleViolations())
                    {
                        sb.AppendLine(rv.ErrorMessage);
                    }
                    throw new BusinessLogicException(sb.ToString());
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        #endregion

        #region buscarEjercicio
        //metodo para buscar un ejercicio en especifico
        public Ejercicio buscarEjercicio(int pidEjercicio)
        {
            return UoW.EjercicioRepository.GetById(pidEjercicio);
        }



        #endregion

        #region buscarRol
        //metodo para buscar un ejercicio en especifico
        public Rol buscarRol(int pidRol)
        {
            return UoW.RolRepository.GetById(pidRol);
        }



        #endregion

        #region consultarMusculosAsociados
        //metodo para consultar los musculos asociados a un ejercicio
        public IEnumerable<Musculo> consultarMusculosAsociados(int idEjercicio)
        {
            return UoW.EjercicioRepository.GetMusculosAsociados(idEjercicio);
        }
        #endregion consultarMusculosAsociados

        #region modificarEjercicio
        //metodo para modificar un ejercicio
        public void modificarEjercicio(int pidEjercicio, String pnombreComun, String pnombreOpcional, String pcodigo, String pimagenInicial, String pimagenFinal, String pnombreMusculoPrincipal, List<Musculo> plistaMusculos, String perroresComunes, String pindicacionesGenerales)
        {
            try
            {
                //consultar un ejercicio por el id del mismo
                Ejercicio objEjercicio = UoW.EjercicioRepository.GetById(pidEjercicio);

                //setea los valores al ejercicio cargado
                objEjercicio.NombreComun = pnombreComun;
                objEjercicio.NombreOpcional = pnombreOpcional;
                objEjercicio.Codigo = pcodigo;
                objEjercicio.PosicionInicial = pimagenInicial;
                objEjercicio.PosicionFinal = pimagenFinal;
                objEjercicio.MusculoPrincipal = pnombreMusculoPrincipal;
                objEjercicio.ListaMusculos = plistaMusculos;
                objEjercicio.IndicacionesGenerales = pindicacionesGenerales;
                objEjercicio.ErroresComunes = perroresComunes;

                if (objEjercicio.IsValid)
                {
                    UoW.EjercicioRepository.Update(objEjercicio);
                    UoW.EjercicioRepository.Save();
                    UoW.EjercicioRepository.Clear();
                }
                else
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (RuleViolation rv in objEjercicio.GetRuleViolations())
                    {
                        sb.AppendLine(rv.ErrorMessage);
                    }
                    throw new BusinessLogicException(sb.ToString());
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        #endregion

        #region filtrarListaEjercicios
        //metodo para filtrar la lista de ejercicios
        public IEnumerable<Ejercicio> filtrarListaEjercicios(String ptextoAfiltrar)
        {
            return UoW.EjercicioRepository.FiltrarListaEjercicios(ptextoAfiltrar);
        }

        #endregion filtrarListaEjercicios

        #region filtrarListaRoles
        //metodo para filtrar la lista de ejercicios
        public IEnumerable<Rol> filtrarListaRoles(String ptextoAfiltrar)
        {
            return UoW.RolRepository.FiltrarListaRoles(ptextoAfiltrar);
        }

        #endregion filtrarListaRoles

        #region listarRoles
        public IEnumerable<Rol> listarRoles()
        {
            return UoW.RolRepository.GetAll();
        }
        #endregion listarRoles

        #region agregarRol
        //metodo para registrar un ejercicio
        public void agregarRol(String pcodigo, String pdescripcion, List<int> plistaPermisos)
        {
            try
            {
                Rol objRol = new Rol(pcodigo, pdescripcion, plistaPermisos);
                if (objRol.IsValid)
                {
                    UoW.RolRepository.Insert(objRol);
                    UoW.RolRepository.Save();
                    UoW.RolRepository.Clear();
                }
                else
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (RuleViolation rv in objRol.GetRuleViolations())
                    {
                        sb.AppendLine(rv.ErrorMessage);
                    }
                    throw new BusinessLogicException(sb.ToString());
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        #endregion agregarRol

        #region modificarRol
        //metodo para registrar un ejercicio
        public void modificarRol(int pidRol, String pcodigo, String pdescripcion, List<int> plistaPermisos)
        {
            try
            {
                Rol objRol = new Rol(pidRol, pcodigo, pdescripcion, plistaPermisos);
                if (objRol.IsValid)
                {
                    UoW.RolRepository.Update(objRol);
                    UoW.RolRepository.Save();
                    UoW.RolRepository.Clear();
                }
                else
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (RuleViolation rv in objRol.GetRuleViolations())
                    {
                        sb.AppendLine(rv.ErrorMessage);
                    }
                    throw new BusinessLogicException(sb.ToString());
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        #endregion modificarRol
    }
}
